//引入公共函数
var util = require('../../utils/util');

//引入user模块用于处理登录操作
var user = require('../../utils/user');

//获得请求的URL
var requestDomain = util.config('requestDomain');

//存放页面实例的变量
var that;

//页面Page函数
Page({

  //页面数据
  data: {

    //菜品类型
    tabs: [],
    
    //菜品类型列表
    foodTypeList: [],

    //菜品已选择的数组
    foodSelectedList: [],

    //菜品已选择的个数
    foodSelectedSum: 0,

    //菜单数据数组
    foodMenuData: [],

    //滑动容器参数
    stv: {
      windowWidth: 0,//屏幕宽度
      lineWidth: 0,
      offset: 0,
      tStart: false
    },

    //激活的标签index
    activeTab: 0,
    
    //菜单是否装载完毕
    loaded: false

  },

  /**
   * 加载点餐页面时触发，params是二维码传入的数据（storeId & tableNum）
   */
  
   onLoad: function (params) {

     console.log('所需数据', util.globalData('storeData'), util.globalData('userData'));

    //获得页面实例
    that = this;
    
    //获得商户数据
    var storeData = util.globalData('storeData');

    console.log(storeData);

    //设置标题为商户名称
    wx.setNavigationBarTitle({
      title: util.globalData('tableNum') +'桌 | ' + storeData.storeName,
    });

    //调用函数获取菜单数据
    that.getFoodMenuData();

  },

  /**
   * 页面显示时触发，用于判断是否在订单页面移除了菜品而此需要把对应菜品选择数归0
   */

  onShow: function() {

    //获得订单页面的菜品选中列表
    let selectedFoodList = util.globalData('selectedFoodData');

    //获得点餐页面的选择的菜品列表以及菜单列表数据
    let {foodSelectedList, foodMenuData} = that.data;

    //用于判断是否找到对应的菜品值
    let found = false;

    //遍历点餐页面的选中列表
    for(let foodIndex in foodSelectedList) {

      //遍历订单页面的选中列表
      for(let selectIndex in selectedFoodList) {

        //判断是否找到对应菜品ID的菜品
        if(selectedFoodList[selectIndex].foodId == foodSelectedList[foodIndex].foodId) {
          
          //找到了对应的菜品，则此菜品是未从订单被移除的菜品
          found = true;

          //直接跳出本次在订单页面选中列表的寻找
          break;
        }

      }

      //判断是否没有找到对应的菜品值
      if(!found) {

        //遍历菜单列表数据
        for(let foodId in foodMenuData) {
          
          //判断是否找到对应的刚刚在订单被移除的菜品
          if(foodSelectedList[foodIndex].foodId == foodId) {

            //将这个菜品在点餐界面的选择量归0
            foodMenuData[foodId].count = 0;

          }

        }
      }

      //回归默认值
      found = false;

    }

    //将数据更新到界面上
    that.setData({
      foodMenuData: foodMenuData,
      foodSelectedList: selectedFoodList,
      foodSelectedSum: selectedFoodList.length
    });
    
  },

  /**
   * 页面隐藏时触发
   */

  onHide: function () {

    //存放已选择的菜品数量列表
    let selectedFoodList = [];

    //遍历出已选择的菜品
    for (let foodId in that.data.foodMenuData) {

      //判断选择的数量是否为0
      if (that.data.foodMenuData[foodId].count > 0) {

        //加入到已选择的菜品列表
        selectedFoodList.push(that.data.foodMenuData[foodId]);

      }

    }

    that.setData({
      foodSelectedList: selectedFoodList,
      foodSelectedSum: selectedFoodList.length
    });

    //将已选择的菜品列表数据放到程序公共数据中
    util.globalData('selectedFoodData', selectedFoodList);

  },

  /**
   * 处理触摸开始事件
   */
 
  handlerStart(e) {

    //获得当前触摸的坐标
    let {clientX, clientY} = e.touches[0];

    //取得起始x坐标值
    that.startX = clientX;

    that.tapStartX = clientX;

    //设置当前已经开始触摸
    that.data.stv.tStart = true;

    //设置当前点击持续的毫秒数
    that.startTime = e.timeStamp;

    //将滑动容器数据更新到界面
    that.setData({ stv: that.data.stv });

  },

  /**
   * 处理触摸移动事件
   */

  handlerMove(e) {

    //获得触摸移动时的坐标值
    let {clientX, clientY} = e.touches[0];

    //获取容器数据
    let {stv} = that.data;

    //计算出x坐标偏移的值
    let offsetX = that.startX - clientX;

    //更新起始的x坐标
    that.startX = clientX;

    //滑动容器的偏移值加上计算的偏移值
    stv.offset += offsetX;

    //判断滑动容器的x偏移值是否小于或等于0
    if (stv.offset <= 0) {

      //设置偏移值为0，防止左边滑动超出界面
      stv.offset = 0;
      
    }

    //判断当前的偏移值是否超过了最后一个tab
    else if (stv.offset >= stv.windowWidth * (that.data.tabs.length - 1)) {

      //设置为到最后一个tab的宽度，防止右边滑动超出界面
      stv.offset = stv.windowWidth * (that.data.tabs.length - 1);

    }

    //将滑动容器数据更新到界面
    this.setData({ stv: stv });

  },

  /**
   * 处理取消触摸事件
   */

  handlerCancel(e) {
    
    //取消滑动

  },

  /**
   * 处理停止触摸事件
   */

  handlerEnd(e) {

    //获得停止触摸的坐标值
    let {clientX, clientY} = e.changedTouches[0];

    //获得停止触摸时的毫秒数
    let endTime = e.timeStamp;

    //获得类型列表和滑动容器数据以及激活的tab
    let {tabs, stv, activeTab} = that.data;

    //获得滑动容器的偏移量和窗口宽度
    let {offset, windowWidth} = stv;

    //获得激活切换tab的偏移值
    let activeOffset = windowWidth / 4;

    //判断是否进行快速滑动
    if (endTime - that.startTime <= 300) {

      //判断是否为向左滑动
      if (that.tapStartX - clientX > activeOffset) {

        //判断当前是否是最后一个tab
        if (activeTab < that.data.tabs.length - 1) {

          //切换到下一个tab
          this.setData({ activeTab: ++activeTab });

        }
      }

      //判断是否为向右滑动 
      else if (that.tapStartX - clientX < -activeOffset) {

        //判断是否是第一个tab
        if (activeTab > 0) {

          //切换到上一个tab
          this.setData({ activeTab: --activeTab });

        }
      }

      //获得总的偏移值
      stv.offset = stv.windowWidth * activeTab;

    }
    else {

      //将偏移值除以屏幕宽度并四舍五入得到要切换的tab
      let tab = Math.round(offset / windowWidth);

      //判断当前被激活的tab是否是计算器出来的这个tab
      if (activeTab != tab) {

        //设置当前的激活tab为计算的tab
        that.setData({activeTab: tab});

      }

      //设置滑动容器的偏移值等于窗口宽度乘以计算出来的tab值
      stv.offset = stv.windowWidth * tab;

    }

    //设置当前滑动已经完成
    stv.tStart = false;

    //更新滑动容器数据到界面
    this.setData({ stv: this.data.stv });

  },

  /**
   * 点击tab切换函数
   */

  handlerTabTap(e) {

    //获得当前点击的tab的index
    let tabIndex = e.currentTarget.dataset.index;

    //菜品类型列表和容器数据以及激活的tab
    let {tabs, stv, activeTab} = this.data;

    //将激活的tab切换为当前点击的tab按钮
    activeTab = tabIndex;

    //设置当前滑动容器偏移值为当前激活的tab的偏移值
    stv.offset = stv.windowWidth * activeTab;

    //将激活的tab以及滑动容器数据更新
    this.setData({
      activeTab: activeTab,
      stv: that.data.stv
    });

  },

  /**
   * 增加所需菜品数量
   */

  addSelectedFood: function(e) {

    //获得菜品id
    let foodId = e.currentTarget.id;

    //获得当前的菜单数据
    let {foodMenuData, foodSelectedSum} = that.data;

    //判断此菜品是否存在以及选择的数量是否达到上限
    if(foodMenuData[foodId] && foodMenuData[foodId].count < 9999) {

        if (foodMenuData[foodId].count == 0) {
            foodSelectedSum++;
        }

        //增加选择菜品的数量
        foodMenuData[foodId].count++;

        //更新修改后的菜单数据到界面
        that.setData({
            foodMenuData: foodMenuData,
            foodSelectedSum: foodSelectedSum
        });

    }
    
  },

  /**
   * 减少所需菜品数量
   */

  delSelectedFood: function(e) {

    //获得菜品id
    let foodId = e.currentTarget.id;

    //获得当前的菜单数据
    let {foodMenuData, foodSelectedSum} = that.data;

    //判断此菜品是否存在以及选择的数量是否达到下限
    if(foodMenuData[foodId] && foodMenuData[foodId].count > 0) {

      //减少选择菜品的数量
      foodMenuData[foodId].count--;

      if (foodMenuData[foodId].count == 0) {
          foodSelectedSum--;
      }

      //更新修改后的菜单数据到界面
      that.setData({
          foodMenuData: foodMenuData,
          foodSelectedSum: foodSelectedSum
      });
      
    }

  },
  
  /**
   * 获取菜品列表数据
   */
  
  getFoodMenuData: function () {

    //显示顶部加载图标
    wx.showNavigationBarLoading();
    
    //发起获取菜单请求
    wx.request({

      //获取菜单数据的接口URL
      url: requestDomain + 'food/find',
      
      //接口需要的数据
      data: {

        //商户ID
        storeId: util.globalData('storeId'),
        
        //验证身份的3rdSession
        _3rdSession: util.globalData('_3rdSession')
      
      },

      method: 'POST',

      //发起请求成功
      success: function (result) {

        wx.stopPullDownRefresh();

        //判断获取菜单数据是否成功
        if(util.checkSuccess(result) && result.data && result.data.data) {

          //获得附加物品列表
          let attachGoodsList = result.data.data.attachGoods;

          //暂时存入公共数据
          util.globalData('attachGoodsList', attachGoodsList);

          //获得所有菜品数据
          var foodMenuData = result.data.data.foodMenuData;

          if(foodMenuData[1]) {
            foodMenuData.sort(function(a, b) {
              return b.foodTimestamp - a.foodTimestamp;
            });
          }

          //获得所有菜品类型列表
          var foodTypeList = result.data.data.foodTypeList;

          //将菜品类型列表更新到界面
          that.setData({ foodTypeList: foodTypeList });

          //设置菜的分类foodTypes
          var tabs = [];

          //遍历菜品类型列表
          for (var foodTypeIndex in foodTypeList) {

            //将菜品类型放入类型列表
            tabs.push(foodTypeList[foodTypeIndex].typeVal);

          }

          //更新菜品类型到菜品列表
          that.setData({tabs: tabs});

          let foodMenuTemp = {};

          //加入图片地址
          for (var foodIndex in foodMenuData) {

            foodMenuTemp[foodMenuData[foodIndex].foodId] = foodMenuData[foodIndex];

            //设置菜品的图片链接
            foodMenuTemp[foodMenuData[foodIndex].foodId].foodPhoto = util.config('foodPhotoRequestUrl').replace('{storeId}', util.globalData('storeId')) + foodMenuData[foodIndex].foodPhoto;

            //设置菜品的选择数量默认值为0
            foodMenuTemp[foodMenuData[foodIndex].foodId].count = 0;

          }

          //更新菜单数据到界面
          that.setData({foodMenuData: foodMenuTemp});

          //尝试获取窗口宽度来设置菜单项目
          try {

            //获得窗口宽度
            let {windowWidth} = wx.getSystemInfoSync();

            //设置每个类别视窗的宽度
            that.data.stv.lineWidth = windowWidth / that.data.tabs.length;

            //设置窗口宽度
            that.data.stv.windowWidth = windowWidth;

            //更新到界面
            that.setData({stv: that.data.stv});

            //设定菜单已经加载完成，可以显示了
            that.setData({loaded: true});

          } catch (e) {

            //显示获取系统信息失败
            util.showError('获取信息失败', '获取您的系统信息时发生错误，请重试');

          }
        }
        else {

          //显示菜单数据错误提示
          util.showError('菜单数据错误', '获取的菜单数据错误，请重试');

        }
        //隐藏顶部加载图标
        wx.hideNavigationBarLoading();
      },

      //发起请求失败
      fail: function() {

        wx.stopPullDownRefresh();

        //隐藏顶部加载图标
        wx.hideNavigationBarLoading();

        //显示发送请求失败的提示
        util.showError('获取菜单数据失败', '发起获取菜单数据请求失败，请重试');

      }
    })
  },

  goOrderList: function() {
    wx.switchTab({
        url: '../order/order',
        fail: function() {
            wx.showModal({
                title: '切换失败',
                content: '切换到订单列表页面失败，请手动点击订单页面',
            });
        }
    });
  },

  onPullDownRefresh: function() {
      that.getFoodMenuData();
  }
});